/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Componente;
import desarrollosoft.ghce.entidades.EstudioLaboratorio;
import desarrollosoft.ghce.entidades.Gravedad;
import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.entidades.Profesional;
import desarrollosoft.ghce.entidades.ResultadoComponente;
import desarrollosoft.ghce.entidades.ValorNormal;
import desarrollosoft.ghce.servicio.interfaces.IServicioHistorial;
import desarrollosoft.ghce.soporte.SecurityUtil;
import desarrollosoft.ghce.vista.interfaces.Actualizable;
import desarrollosoft.ghce.vista.interfaces.Estado;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.Converter;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraVentanaCargaResultadoLaboratorio {
    
    @WireVariable("servicioHistorial")
    private IServicioHistorial servicioHistorial;
    
    private EstudioLaboratorio estudioLaboratorio;
    private EstudioLaboratorio estudioLaboratorioAnterior;
    private Paciente paciente;
    private Actualizable actualizable;
    private Estado estado;
    private String nombreUsuarioActual;
    
    private String nombreEstudio;
    private List<ResultadoComponente> listaResultadoComponentes;
    private boolean valorEditable;
    private boolean botonesActivados;
    private List<Gravedad> listaGravedades;
    private Converter conversorDouble;
    
    @Init
    public void inicializar() {
        Execution ejecucion = Executions.getCurrent();
        estudioLaboratorio = (EstudioLaboratorio) ejecucion.getArg().get("estudioLaboratorio");
        paciente = (Paciente) ejecucion.getArg().get("paciente");
        actualizable = (Actualizable) ejecucion.getArg().get("actualizable");
        estado = (Estado) ejecucion.getArg().get("estado");
        nombreUsuarioActual = SecurityUtil.getUserName();
        conversorDouble = new ConversorDouble();
        
        estudioLaboratorioAnterior = estudioLaboratorio.clonar();
        
        nombreEstudio = "Nombre Estudio: " + estudioLaboratorio.getDescripcion();
        listaGravedades = servicioHistorial.obtenerTodasGravedades();
        listaResultadoComponentes = servicioHistorial.traerResultados(estudioLaboratorio);
        
        elegirValoresNormales(listaResultadoComponentes);
        
        if (estado.equals(Estado.CONSULTANDO)) {
            valorEditable = false;
            botonesActivados = false;
        } else if (estado.equals(Estado.MODIFICANDO)) {
            valorEditable = true;
            botonesActivados = true;
        }
    }
    
    /* POR ACA HAY QUE CORREGIR POR EL TEMA DE VALOR NORMAL ELEGIDO EN NULL (o cambiar el la visual para los valores en null) */
    private void elegirValoresNormales(List<ResultadoComponente> listaResultados) {
        for (ResultadoComponente resultadoComponente : listaResultados) {
            Componente componente = resultadoComponente.getComponente();
            ValorNormal valorNormalElegido = servicioHistorial.elegirValorNormal(componente,paciente);
            componente.setValorNormalElegido(valorNormalElegido);
        }
    }
    
    @Command("verQuienCompleto")
    public void verClickBotonQuienCompleto() {
        Profesional profesionalQueCompleto = estudioLaboratorio.getProfesionalQueLoCompleto();
        if (profesionalQueCompleto == null) {
            Messagebox.show("Este estudio todavía no ha sido completado");
            return;
        }
        Map<String, Object> argumentos = new HashMap<>();
        argumentos.put("profesional", profesionalQueCompleto);
        Window ventana = (Window) Executions.createComponents("VentanaDetallesProfesional.zul", null, argumentos);
        ventana.doModal();
    }
    
    @NotifyChange({"valorEditable","botonesActivados"}) 
    @Command("guardar")
    public void clickBotonGuardar() {
        if (estado.equals(Estado.MODIFICANDO)) { // unico estado posible por ahora
            try {
                // si cargaron todos los resultados, seteo hoy como fecha de fin
                if (estudioLaboratorio.getFechaFin() == null && cargaronTodo(listaResultadoComponentes)) {
                    estudioLaboratorio.setFechaFin(new Date());
                }
                servicioHistorial.guardarResultados(estudioLaboratorio,listaResultadoComponentes,nombreUsuarioActual);
                valorEditable = false;
                botonesActivados = false;
                actualizable.guardaronVentanaHija(new Object());
            } catch (Exception ex) {
                Messagebox.show(ex.toString()); // habria que parsearlo
            }
        }
    }
    
    private boolean cargaronTodo(List<ResultadoComponente> listaResultados) {
        for (ResultadoComponente resultadoComponente : listaResultados) {
            if (resultadoComponente.getValor() == null) {
                return false;
            }
        }
        return true;
    }
    
    @Command("cancelar")
    public void clickBotonCancelar() {
        if (estado.equals(Estado.MODIFICANDO)) { // unico estado posible
            setearParametros(estudioLaboratorio,estudioLaboratorioAnterior);
            valorEditable = false;
            botonesActivados = false;
            elegirValoresNormales(listaResultadoComponentes);
            BindUtils.postNotifyChange(null,  null, this, "*");
        }
    }
    
    private void setearParametros(EstudioLaboratorio estudioActual, EstudioLaboratorio estudioAnterior) {
        estudioActual.setGravedad(estudioAnterior.getGravedad());
        estudioActual.setProfesionalQueLoCompleto(estudioAnterior.getProfesionalQueLoCompleto());
        estudioActual.setListaResultadoComponente(estudioAnterior.getListaResultadoComponente());
        listaResultadoComponentes = estudioAnterior.getListaResultadoComponente();
    }
    
    public EstudioLaboratorio getEstudioLaboratorio() {
        return estudioLaboratorio;
    }

    public List<Gravedad> getListaGravedades() {
        return listaGravedades;
    }
    
    public Converter getConversorDouble() {
        return conversorDouble;
    }
    
    public String getNombreEstudio() {
        return nombreEstudio;
    }

    public List<ResultadoComponente> getListaResultadoComponentes() {
        return listaResultadoComponentes;
    }

    public boolean getValorEditable() {
        return valorEditable;
    }
    
    public boolean getBotonesActivados() {
        return botonesActivados;
    }
}
